<?php
$a=[
    ['id'=>1,'name'=>'上海','fid'=>0],
    ['id'=>2,'name'=>'北京','fid'=>0],
    ['id'=>3,'name'=>'曹阳','fid'=>1],
    ['id'=>4,'name'=>'郊区','fid'=>1],
    ['id'=>5,'name'=>'珠海','fid'=>2],
    ['id'=>6,'name'=>'萧县','fid'=>3],
    ['id'=>7,'name'=>'茅草房','fid'=>4],
    ['id'=>8,'name'=>'海','fid'=>6],
];
$b=[];
foreach ($a as $value){
    $b[$value['id']]=$value;
}
//function test($b,$id){
//    $arr=[];
//    $m=0;
//     for ($i=1;$i<=count($b)-1;$i++){
//           if($b[$i]['fid']==$id){
//               $arr[$m]=$b[$i];
//               $arr[$m]['son']=test($b,$b[$i]['id']);
//               $m++;
//           }
//     }
//     return $arr;
//};
//
//$arr=test($b,0);
//echo "<pre>";print_r($arr);echo "<pre>";

function test($b){
        $arr=[];
       foreach ($b as $item=>$value){
             if(isset($b[$value['fid']])){
                 $b[$value['fid']]['son'][]= &$b[$item];
             }else{
                 echo $item;
                  $arr[]=&$b[$item];
             }
       }
       return $arr;
}

$arr=test($b);
echo "<pre>";print_r($arr);echo "<pre>";